#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int n,m,head[MAXN],cnt,a[MAXN],dfn[MAXN],mp[MAXN],root[MAXN],nxt[MAXN],pre[MAXN],b[MAXN];
struct edge
{
	int v,next;
}e[MAXN*2];
struct tree
{
	int lc,rc,siz;
}t[MAXN*20];
void addedge(int x,int y)
{
	e[++cnt]=(edge){y,head[x]};
	head[x]=cnt;
	return;
}
void dfs(int u,int fa)
{
	dfn[u]=++cnt;pre[cnt]=u;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs(v,u);
	}
	nxt[u]=cnt;
	return;
}
void insert(int last,int &o,int l,int r,int v)
{
	t[o=++cnt]=t[last];
	++t[o].siz;
	if(l==r)return;
	int mid=(l+r)>>1;
	if(v<=mid)insert(t[last].lc,t[o].lc,l,mid,v);
	else insert(t[last].rc,t[o].rc,mid+1,r,v);
	return;
}
int query(int last,int o,int l,int r,int k)
{
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(k<=t[t[o].lc].siz-t[t[last].lc].siz)return query(t[last].lc,t[o].lc,l,mid,k);
	else return query(t[last].rc,t[o].rc,mid+1,r,k-t[t[o].lc].siz+t[t[last].lc].siz);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]),mp[i]=a[i];
	sort(mp+1,mp+1+n);
	for(int i=1;i<=n;++i)a[i]=lower_bound(mp+1,mp+1+n,a[i])-mp,b[a[i]]=i;
	for(int i=1;i<n;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(x,y);
		addedge(y,x);
	}
	cnt=0;
	dfs(1,0);
	cnt=0;
	for(int i=1;i<=n;++i)insert(root[i-1],root[i],1,n,a[pre[i]]);
	scanf("%d",&m);
	while(m--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",b[query(root[dfn[x]-1],root[nxt[x]],1,n,y)]);
	}
	return 0;
}
